﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DotLink;
using DotBusiness.Models;
using DotHandler;
using DotLink.Atendimento;
using System.Globalization;

namespace JAVALI_Cardapio_Atendimento.Atendimento
{
    public partial class FrmCadastrarPedidoDelivery : Form
    {
        public Form Before { get; set; }

        #region Construtor
        public FrmCadastrarPedidoDelivery()
        {
            InitializeComponent();
        }
        #endregion

        #region Propriedades
        
        //Variável de tipo Pedido
        private Pedido pedidoCadastrado;

        private Boolean salvo = false;
        #endregion

        #region Métodos

        /// <summary>
        /// Carregamento inicial do formulário de Cadastro de Pedidos Deliverys
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmCadastrarPedidoDelivery_Load(object sender, EventArgs e)
        {
            //Combo de Produtos que já foram cadastrados, que vêm preenchido assim que o formulário é inicializado
            string [] produtos = new string[Bag.P_Produtos.Quantity];
            int i = 0;
            Bag.P_Produtos.Each((o)=>{
                produtos[i] = o.ToString("Nome");
                i+=1;
                return true;
            });
            cbProdutoPedidoDelivery.DataSource = produtos;

            //Combo de Tipos de Pagamento, que vem preenchido assim que o formulário é inicializado
            string[] arrTpPagamento = new string[5];
            arrTpPagamento[0] = "Visa";
            arrTpPagamento[1] = "MasterCard";
            arrTpPagamento[2] = "Electron";
            arrTpPagamento[3] = "SodeXo";
            arrTpPagamento[4] = "Dinheiro";
            cbTipoPagamentoPedidoDelivery.DataSource = new BindingSource(arrTpPagamento, null);
        }

        /// <summary>
        /// No clique do botão Salvar, o cadastro de um Pedido Delivery é efetuado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOkPedidoDelivery_Click(object sender, EventArgs e)
        {
            if (dtCadastroPedidoDelivery.RowCount < 1)
            {
                MessageBox.Show("Digite todos os campos para o cadastro!");
                return;
            }
            if (!String.IsNullOrEmpty(txtNomeMotoboyPedidoDelivery.Text) && !String.IsNullOrEmpty(txtEnderecoEntregaPedidoDelivery.Text))
            {
                pedidoCadastrado.Endereco = txtEnderecoEntregaPedidoDelivery.Text;
                pedidoCadastrado.Entregador = txtNomeMotoboyPedidoDelivery.Text;
                salvo = true;
                this.Before.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Digite todos os campos para o cadastro!");
            }
        }

        /// <summary>
        /// Adiciona um produto ao pedido que está sendo cadastrado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdicionarPedidoDelivery_Click(object sender, EventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(cbProdutoPedidoDelivery.Text))
                {
                    Produto p = Bag.P_Produtos.Find("Nome", cbProdutoPedidoDelivery.Text);
                    var qtd = Int32.Parse(txtQuantidadeProduto.Text);
                    Bag.Atendimento.adicionarProdutoPedido(p.Id, pedidoCadastrado.Id, qtd, true);
                    dtCadastroPedidoDelivery.DataSource = Bag.MProdutosPedidos_Array(pedidoCadastrado.Id, true);
                }
                else
                {
                    MessageBox.Show("Digite todos os campos para o cadastro!");
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Cadastro não efetuado, tente novamente!");
            }
        }

        /// <summary>
        /// No clique do botão Voltar, retorna para o Menu de Atendimento e fecha o formulário atual de Cadastro de Pedido Delivery
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnVoltarMenuAtendimento_Click(object sender, EventArgs e)
        {
            this.Before.Show();
            this.Hide();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtCadastroPedidoDelivery_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            btnOkPedidoDelivery.Visible = true;
            var data = (MProdutoPedido[])dtCadastroPedidoDelivery.DataSource;
            var tempoTotal = from prod in data select (int)((prod.Tempo * prod.Quantidade)/((prod.Quantidade>1)?2:1));
            var tempo = (int)((tempoTotal.Max() + (4 * tempoTotal.Average()) + tempoTotal.Min()) * tempoTotal.Count()) / 6;
            lblSomaTempoPreparoProdutos.Text = ((tempo > 60) ? (int)(tempo / 60) + "" : "00") + ":" + ((tempo < 10) ? "0" + tempo : (tempo % 60) + "") + "";
            tempo += 15;
            lblTempoMaximoEntregaPedidoDelivery.Text = ((tempo > 60) ? (int)(tempo / 60) + "" : "00") + ":" + ((tempo < 10) ? "0" + tempo : (tempo % 60) + "") + "";

            var precoTotal = from prod in data select Double.Parse(prod.Preco, NumberStyles.Currency) * prod.Quantidade;
            var preco = precoTotal.Sum();
            
            lblPrecoTotalResultadoPedidoDelivery.Text = String.Format("R${0:0.00}", preco);
        }
        
        /// <summary>
        /// No evento de "keypress" (pressionar do teclado), o textbox de quantidade de produtos só permite ser digitado números
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtQuantidadeProduto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8) {
                e.Handled = true;
            }
        }

        /// <summary>
        /// No clique do link de Voltar, retorna para o Menu de Atendimento e fecha o formulário de Cadastro de Pedido Delivery
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void linkVoltarMenuAtendimento_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            this.Before.Show();
            this.Hide();
        }

        private void FrmCadastrarPedidoDelivery_VisibleChanged(object sender, EventArgs e)
        {
            if (salvo == false && this.Visible == false)
            {
                Bag.L_Delivery.Remove(Bag.L_Delivery.Index);
                Bag.L_Delivery.Identity += 1;
            }
            else if(this.Visible==true)
            {
                //Campos que já vem preenchidos na inicialização do formulário, com as datas e horas atuais
                lblHoraPedidoDeliveryCadastrar.Text = DateTime.Now.Hour + " : " + DateTime.Now.Minute;
                lblDataPedidoDeliveryCadastrar.Text = DateTime.Now.Day + "/" + DateTime.Now.Month + "/" + DateTime.Now.Year;

                // Método de adicionar pedido é atribuido a variavel pedidoCadastrado, do tipo Pedido, 
                //passando argumentos vazios, pois aqui é o Load do formulário
                pedidoCadastrado = Bag.Atendimento.adicionarPedido(true, "", "", "");

                //Campo de texto, que vem com valor padrão 1, e não permite letras
                txtQuantidadeProduto.Text = "1";
                salvo = false;
            }
        }

        private void FrmCadastrarPedidoDelivery_Shown(object sender, EventArgs e)
        {
            if (Bag.P_Produtos.Quantity < 1 )
            {
                this.Hide();
                MessageBox.Show("Não há produtos cadastrados.\n Cadastre um produto primeiro antes de cadastrar um pedido.");
                FrmCadastrarProduto cadProduto = new FrmCadastrarProduto();
                cadProduto.Before = this.Before;
                cadProduto.Show();
                return;
            }
        }
        #endregion
    }
}
